const Service = require('egg').Service;
const crypto = require('crypto');

class LoginService extends Service {
  //todo 注册方法
  async create({ provider, username, password }) {
    console.log('进入service.login.create方法')
    //todo 从this面拿到config config可以拿到config.default.js里的配置（通过config.userConfig.secret
    const { ctx, config } = this;
    console.log('username'+username)
    //todo .findOne({ where:{}  })
    const user = await ctx.model.User.findOne({ where: { provider, username } });
    console.log('user+'+user)
    if (user) {
      ctx.body = {
        errcode: '1', // 具体错误代码
        message: '用户名重复',
      };
      return;
    }
    //todo 拿到配置的密钥  用于密码加密
    const secret = config.userConfig.secret;
    try {
      const user = await ctx.model.User.create({
        provider: 'local',
        username,
        //todo 使用crypto库对密码进行加密
        password: crypto
            .createHmac('sha256', secret)
            .update(password)
            .digest('hex')

      });
      const userInfo = await ctx.model.UserInfo.create({
        nickname: username
      });
      user.setUser(userInfo);

      ctx.body = {
        errcode: 0,
        errmsg: null,
        data: { id: user.id }
      };
    } catch (error) {
      console.warn('error', error);
    }
  }
  async login({ provider, username, password }) {
    const { ctx, config, service } = this;

    if (provider === 'local') {
      const secret = config.userConfig.secret;
      const user = await ctx.model.User.findOne({ where: { provider, username } });
      if (!user) {
        ctx.body = {
          errcode: '1',
          errmsg: '用户名错误'
        };
        return;
      }
      //todo 密码比对  用crypto再加密一次
      if (
          user.password !==
          crypto
              .createHmac('sha256', secret)
              .update(password)
              .digest('hex')
      ) {
        ctx.body = {
          errcode: '1',
          errmsg: '密码错误'
        };
        return;
      }
      //todo 登录成功将用户存入session  ctx.session.user = user;
      ctx.session.user = user;
      //todo 调用同目录下的user文件 的getUserAttribute方法 获取用户详情以及对应的角色权限userInfo,roles,rights
      const object = await service.user.getUserAttribute();

      ctx.body = {
        errcode: 0,
        errmsg: null,
        //todo Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。
        data: Object.assign(object, { id: user.id })
      };
    }
  }

}

module.exports = LoginService;
